﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GeneralServices.ViewModel
{
    /// <summary>
    /// Classe permettant de stocker tous les view models de l'application au démarrage de celle-ci.
    /// </summary>
    public class ServicesSingle
    {
        #region Attributs
        /// <summary>
        /// Singleton de la classe ServicesSingle
        /// </summary>
        private static ServicesSingle _instance = null;

        /// <summary>
        /// Liste de données présentes dans le singleton
        /// </summary>
        private List<object> data;
        #endregion

        #region Propriétés

        #endregion

        #region Constructeur 
        /// <summary>
        /// Constructeur vide
        /// </summary>
        private ServicesSingle()
        {
            data = new List<object>();
        }
        #endregion

        #region Méthodes
        
        /// <summary>
        /// Permet d'enregistrer un type de classe dans le service.
        /// Un constructeur vide doit être présent dans la classe T.
        /// </summary>
        /// <typeparam name="T">Type de la classe à enregistrer.</typeparam>
        public static void Register<T>()
        {
            object obj =  Activator.CreateInstance(typeof(T));
            
            if (!(obj is ViewModelBase))
                throw new Exception("Seul des classes héritant de ViewModelBase sont acceptés.");

            if (_instance == null)
                _instance = new ServicesSingle();

            foreach (object o in _instance.data)
            {
                if (o is T)
                    return;
            }
            
            // Création de l'instance.
            _instance.data.Add(Activator.CreateInstance(typeof(T)));
        }

        
        /// <summary>
        /// Permet de récupérer l'instance de la classe T précédement enregistrer.
        /// Si T n'est pas présent, return null.
        /// </summary>
        /// <typeparam name="T">Type de la classe de l'instance recherchée</typeparam>
        /// <returns>Retourne une instance de la classe T si elle est présente, sinon null.</returns>
        public static T Get<T>() where T : class
        {
            object obj = Activator.CreateInstance(typeof(T));

            if (!(obj is ViewModelBase))
                throw new Exception("Seul des classes héritant de ViewModelBase sont acceptés.");

            if (_instance == null)
                _instance = new ServicesSingle();

            foreach (object o in _instance.data)
            {
                if (o is T)
                    return (o as T);
            }

            return null;
        }

        #endregion
    }
}
